"use strict";

// 导入 Electron 的 session 模块
const { session } = require("electron");

/**
 * Cookie 控制器类
 * 提供设置、删除和获取 Cookie 的方法
 */
class CookieController {
  /**
   * 批量设置 Cookie
   * @param {Array<Object>} cookies - Cookie 对象数组
   * @returns {Promise<boolean>} - 所有 Cookie 设置成功返回 true
   * @throws {Error} - 如果任意一个 Cookie 缺少必需字段或设置失败
   */
  async setCookies(cookies) {
    for (const cookie of cookies) {
      await this.setCookie(cookie); // 复用 setCookie 方法
    }

    return true;
  }
  /**
   * 设置 Cookie
   * @param {Object} cookie - Cookie 对象
   * @param {string} cookie.url - Cookie 的 URL
   * @param {string} cookie.name - Cookie 的名称
   * @param {string} cookie.value - Cookie 的值
   * @param {boolean} [cookie.secure=false] - 是否是安全 Cookie
   * @param {boolean} [cookie.httpOnly=false] - 是否仅 HTTP 访问
   * @param {string} [cookie.domain] - Cookie 的域名
   * @param {string} [cookie.path] - Cookie 的路径
   * @param {number} [cookie.expirationDate] - Cookie 的过期日期
   * @returns {Promise<boolean>} - 设置成功返回 true
   * @throws {Error} - 缺少必需字段时抛出错误
   */
  async setCookie(cookie) {
    const {
      url,
      name,
      value,
      secure = false,
      httpOnly = false,
      domain,
      path,
      expirationDate,
    } = cookie;

    // 验证必需字段
    if (!url || !name || value == null) {
      throw new Error("Missing required fields: url, name or value");
    }

    // 设置 Cookie
    await session.defaultSession.cookies.set({
      url,
      name,
      value,
      ...(secure !== undefined ? { secure } : {}),
      ...(httpOnly !== undefined ? { httpOnly } : {}),
      ...(domain !== undefined ? { domain } : {}),
      ...(path !== undefined ? { path } : {}),
      ...(expirationDate !== undefined ? { expirationDate } : {}),
    });

    return true;
  }

  /**
   * 删除 Cookie
   * @param {Object} params - 删除参数
   * @param {string} params.url - Cookie 的 URL
   * @param {string} params.name - Cookie 的名称
   * @returns {Promise<boolean>} - 删除成功返回 true
   * @throws {Error} - 缺少必需字段时抛出错误
   */
  async deleteCookie({ url, name }) {
    // 验证必需字段
    if (!url || !name) {
      throw new Error("Missing required fields: url or name");
    }

    // 删除 Cookie
    await session.defaultSession.cookies.remove(url, name);
    return true;
  }

  /**
   * 获取 Cookie
   * @param {Object} params - 获取参数
   * @param {string} params.url - Cookie 的 URL
   * @param {string} params.name - Cookie 的名称
   * @returns {Promise<Object|null>} - 返回 Cookie 对象或 null
   * @throws {Error} - 缺少必需字段时抛出错误
   */
  async getCookie({ url, name }) {
    // 验证必需字段
    if (!url || !name) {
      throw new Error("Missing required fields: url or name");
    }

    // 获取 Cookie
    const cookies = await session.defaultSession.cookies.get({ url, name });
    return cookies.length > 0 ? cookies[0] : null;
  }
}

CookieController.toString = () => "[class CookieController]";

module.exports = CookieController;
